/**
 * 题目
 * Semantic Versioning 是一个前端通用的版本定义规范。
 * 格式为“{MAJOR}.{MINOR}.{PATCH}-{alpha|beta|rc}.{number}”，
 * 要求实现 compare(a, b) 方法，比较 a, b 两个版本大小。
 * 
 * 描述
 * •当 a > b 是返回 1；
 * •当 a = b 是返回 0；
 * •当 a < b 是返回 -1；
 * •其中，rc > beta > alpha，major > minor > patch；
 * 
 * 例子
 * 1.2.3 < 1.2.4 < 1.3.0.alpha.1 < 1.3.0.alpha.2 < 1.3.0.beta.1 < 1.3.0.rc.1 < 1.3.0
*/

function compareVersion(str1, str2) {
  // 创建 rc, beta, alpha 权重, 替换为数值
  let map = { rc: 3, beta: 2, alpha: 1 }
  str1 = str1.replace(/(rc|beta|alpha)/g, match => map[match])
  str2 = str2.replace(/(rc|beta|alpha)/g, match => map[match])
  // 生成器获取每一项的字符
  function* walk(str) {
    let step = ''
    const terminals = ['.', '-']
    for(let i = 0; i < str.length; i++) {
      if (terminals.includes(str[i])) {
        yield step;
        step = ''
      } else {
        step += str[i]
      }
    }
    if (step) yield step
  }
  // 迭代比较
  const gen1 = walk(str1)
  const gen2 = walk(str2)
  while (true) {
    const iter1 = gen1.next()
    const iter2 = gen2.next()
    let num1 = parseInt(iter1.value || 0, 10)
    let num2 = parseInt(iter2.value || 0, 10)

    if (iter1.done && iter2.done) break;
    if (num1 > num2) return 1
    if (num1 < num2) return -1
  }
  return  0
}

// 测试
let str1 = "3.3.0-alpha.1";
let str2 = "3.3.0-rc.1";
console.log(compareVersion(str1, str2)); // -1
